package pers.cz.config;

import pers.cz.log.LogUtils;
import pers.cz.tools.StringUtils;

/**
 * @program: PostGirl-panent
 * @description: 所有配置类的基类
 * @author: Cheng Zhi
 * @create: 2022-06-27 21:53
 **/
public abstract class Cfg {

    /**
     * 返回指定键值的配置
     * @param key
     * @return
     */
    public ConfigItem valueOf(String key) {
        return new Config(key);
    }

    /**
     * 获取指定键值的Boolean值
     * @param key
     * @return
     */
    public boolean getBoolean(ConfigItem key, boolean defaultValue) {

        String s = get(key);
        return StringUtils.toBoolean(s, defaultValue);
    }

    /**
     * 获取指定键值的Double值
     * @return
     */
    public double getDouble(ConfigItem key, double defaultValue) {

        String s = get(key);

        try {
            double value = Double.parseDouble(s);
            return value;
        } catch (Exception e) {
            LogUtils.warn(s + "转换为Double时，转换异常请检查");
        }
        return defaultValue;
    }

    /**
     * 获取指定键值的Long值
     * @param key
     * @param defaultValue
     * @return
     */
    public long getLong(ConfigItem key, long defaultValue) {
        String s = get(key);

        try {
            long value = Long.parseLong(s);
            return value;
        } catch (Exception e) {
            LogUtils.warn(s + "转换为Long时，转换异常请检查");
        }
        return defaultValue;
    }

    /**
     * 获取指定键值的int值
     * @param key
     * @param defaultValue
     * @return
     */
    public int getInt(ConfigItem key, int defaultValue) {
        String s = get(key);
        try {
            int value = Integer.parseInt(s);
            return value;
        } catch (Exception e) {
            LogUtils.warn(s + "转换为int时，转换异常请检查");
        }

        return  defaultValue;
    }

    /**
     * 根据key获取value
     * @param itemKey
     * @return
     */
    public String get(ConfigItem itemKey) {

        String key = "";
        // 如果itemKey属于Config类型
        if (itemKey instanceof Enum) {
            key = itemKey.name();
        } else {
            key = itemKey.toString();
        }

        return get(key, "");
    }

    /**
     *  获取带有默认value的key值，如果没有获取到就返回默认值
     * @param itemKey
     * @param defaultValue
     * @return
     */
    public String get(ConfigItem itemKey, String defaultValue) {
        String key = getKey(itemKey);
        return get(key, defaultValue);
    }

    public String getKey(ConfigItem configItem) {
        return configItem.toString();
    }

    /**
     * 定义抽象方法，留给继承该类的子类去实现 获取key对应的value,如果不存在value,则返回默认的value
     * @param key
     * @param defaultKeyValue
     * @return
     */
    protected abstract String get(String key, String defaultKeyValue);
}
